package com.qf.controller;

import com.qf.pojo.SmsInterfaceForm;
import com.qf.service.SmsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * author:z
 * time:2021/12/28 20:39
 * description:客户端新对接接口
 */
@RestController
@RequestMapping("/sms")
public class SmsController {

    //从码云git仓库的配置文件中获取这个属性
    //获取被nginx代理后request中的ip地址
    @Value("${ip-header}")
    private List<String> ipHeaders;

    @Autowired
    private HttpServletRequest request;

    @Autowired
    private SmsService smsService;

    //客户发送短信，对接接口
    @PostMapping("/smsInterface")
    public Map<String,String> smsInterface(SmsInterfaceForm smsForm){
        //1.获取客户服务器的IP地址
        String ip = getIpAddress();
        smsForm.setIp(ip);
        //2.校验短信对象中的属性不能为空
        Map<String, String> resultMap = checkNull(smsForm);
        if(resultMap!=null&&resultMap.size()>0){
            return resultMap;
        }
        //3.调用service进行深度校验短信对象的每一个属性
        resultMap = smsService.checkSmsForm(smsForm);
        //4.如果没有问题，返回给客户一个相应编码

        return resultMap;
    }

    //校验短信对象是否为空，并返回响应编码
    private Map<String,String> checkNull(SmsInterfaceForm smsForm){
        Map<String,String> resultMap=new HashMap<>();

        if(StringUtils.isEmpty(smsForm.getClientID())){
            resultMap.put("code","101");
            resultMap.put("msg","clientId错误");
        }
        if(StringUtils.isEmpty(smsForm.getContent())){
            resultMap.put("code","104");
            resultMap.put("msg","消息长度错，为空或超长（目前定为500个字）");
        }
        if(StringUtils.isEmpty(smsForm.getIp())){
            resultMap.put("code","103");
            resultMap.put("msg","IP校验错误");
        }
        if(StringUtils.isEmpty(smsForm.getMobile())){
            resultMap.put("code","105");
            resultMap.put("msg","手机号错误");
        }
        if(StringUtils.isEmpty(smsForm.getPwd())){
            resultMap.put("code","102");
            resultMap.put("msg","密码错误");
        }
        if(StringUtils.isEmpty(smsForm.getSrcID())){
            resultMap.put("code","106");
            resultMap.put("msg","下行编号（srcID）错误");
        }
        return resultMap;
    }

    /*
    获取客户服务器的IP地址
    客户有可能被nginx代理，也有可能没有被nginx代理
     */
    //1.被nginx代理后的请求中获取ip地址
    private String getIpAddress(){
        //获取被nginx代理后的请求头属性名称集合
        if(ipHeaders!=null){
            for (String ipHeader : ipHeaders) {
                //从请求头中根据属性名，获取属性值，也就是ip地址
                String ip = request.getHeader(ipHeader);
                //判断是否能够获取到IP地址
                if(!StringUtils.isEmpty(ip)&&!"unknow".equalsIgnoreCase(ip)){
                    return ip;
                }
            }
        }
        //2.获取没有被nginx代理的请求中的ip地址
        String ip = request.getRemoteAddr();
        return ip;
    }
}
